import { Scanner } from './Scanner';

/**
 * 模板字符串解析成 tokens
 * @param {*} template 
 * @param {*} data 
 */
function parseTemplateToTokens (template, data) {
  const scanner = new Scanner(template);
  const tokens = [];
  while (!scanner.eos()) {
    /* 收集 {{ 前面的文本 */
    tokens.push(['text', scanner.scanUtil('{{')]);
    /* 跳过 {{ */
    scanner.scan('{{');
    /* 收集 {{ 后面的文本 */
    const words = scanner.scanUtil('}}');
    /* 判断 {{ 后面的文本是否为空 */
    if (words !== '') {
      if (words[0] == '#') {
        tokens.push(['#', words.substring(1)]);
      } else if (words[0] == '/') {
        tokens.push(['/', words.substring(1)]);
      } else {
        tokens.push(['name', words]);
      }
    }
    /* 跳过 }} */
    scanner.scan('}}');
  }
  // console.log(tokens);
  return foldTokens(tokens);
  // return tokens;
}
/* 折叠 tokens */
function foldTokens (tokens) {
  let result = [], stack = [];
  for (let i = 0; i < tokens.length; i++) {
    const token = tokens[i];
    if (token[0] === '#') {
      token[2] = [];
      /* 如果#开头，给token下标为2的项创建一个空数组，去收集子节点 */
      stack.push(token);
    } else if (token[0] === '/') {
      /* 如果/开头，将栈顶元素弹出 */
      const data = stack.pop();
      /* 如果栈为空，说明当前token是根节点，
      将token添加到result中,否则将token添加到栈顶元素的下标为2的项中 */
      if (stack.length !== 0) {
        stack[stack.length - 1][2].push(data);
      } else {
        result.push(data);
      }
    } else {
      /* 如果不是#或者/开头，
      如果栈不为空 将token添加到栈顶元素的下标为2的项中，否则将token添加到result中 */
      if (stack.length !== 0) {
        stack[stack.length - 1][2].push(token);
      } else {
        result.push(token);
      }
    }
  }
  return result;
}

export {
  parseTemplateToTokens
}
